/*
 * ref https://www.cnblogs.com/ezoiLZH/p/9607849.html
 * */
#include<stdio.h>
#include<string.h>

//const int MAX=1e6+5;
//const int MAX=100;
#define   MAX ((int)1e6+6)
//#define max(a,b) (a)>(b)
static inline int max(int a,int b)
{
    return a>b?a:b;
}
int n,m;
int tax[MAX],rak[MAX],tp[MAX],sa[MAX];
char s[MAX];

void sort(int a[],int b[]){
    for(int i=0;i<=m;i++)tax[i]=0;
    for(int i=1;i<=n;i++)tax[a[i]]++;
    for(int i=1;i<=m;i++)tax[i]+=tax[i-1];
    for(int i=n;i>=1;i--)sa[tax[a[b[i]]]--]=b[i];
}

int comp(int r[],int a,int b,int k){
    return r[a]==r[b]&&r[a+k]==r[b+k];
}

void get_sa(int a[],int b[]){
    for(int i=1;i<=n;i++)
    m=max(m,a[i]=s[i]-'0'),b[i]=i;
    sort(a,b);
    for(int p=0,j=1;p<n;j<<=1,m=p){
        p=0;
        for(int i=1;i<=j;i++)b[++p]=n-j+i;
        for(int i=1;i<=n;i++)if(sa[i]>j)b[++p]=sa[i]-j;
        sort(a,b);
        int *t=a;a=b;b=t;
        a[sa[1]]=p=1;
        for(int i=2;i<=n;i++)
        a[sa[i]]=comp(b,sa[i],sa[i-1],j)?p:++p;
    }
}

int main(){
    scanf("%s",s+1);
    n=strlen(s+1);
    get_sa(rak,tp);
    for(int i=1;i<=n;i++)printf("%d ",sa[i]);


    return 0;
}
